home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / gratif.c < prev    next >
Text File  |  1994-11-16  |  6KB  |  283 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <tifflib.h>
  10. #include <egb.h>
  11. #include <mos.h>
  12. #include <snd.h>
  13. #include "tetujin.h"
  14.  
  15. static FILE *fptif ;
  16. static int xtif, ytif ;
  17. static int colorMode ;
  18. static char *imageBuf ;
  19. static int counter ;
  20.  
  21. /* tiff check head (stack:4096Byte以上) */
  22.  
  23. tiffCheckHead( char *name, int *c, int *x, int *y,
  24.                int *comp, int *fill, long *strip, long *clut )
  25. {
  26.     FILE *fp ;
  27.     char work[4096] ;
  28.  
  29.     if( ( fp = fopen( name, "rb" ) ) == NULL )return READ_FAIL ;
  30.         /* ファイルオープン */
  31.     fread( work, 1, 4096, fp );    /* 最初のデータロード */
  32.         /* ヘッダの解析 */
  33.     if( TIFF_getHead( work, 4096 ) < 0 ){
  34.         fclose( fp );
  35.         return ILLEGAL_DATA ;
  36.     }
  37.     fclose( fp );
  38.         /* タグの内容のチェック */
  39.     *c = TIFF_checkMode( x, y, comp, fill, strip, clut );
  40.     return NOERR ;
  41. }
  42.  
  43. /*
  44.     1600万色用 TIFF loader
  45.  
  46.     32k, 1600万色のtifdataを1600万色データに変換しながら読み込む。
  47.     workは DECOMP_WORK_SIZE + LOADBUFSIZE + EXPBUFSIZEバイト必要。
  48.     ファイル名nameのtifをバッファbufferに読み出す。
  49.     dx, dyに絵の大きさを返す。
  50. */
  51.  
  52. /* ライブラリから呼ばれる,バッファに対する操作の関数 */
  53. static tifLoadGet( bp, size )
  54. char *bp ;
  55. int size ;
  56. {
  57.     if( fread( bp, size, 1, fptif ) < 1 ) 
  58.         return -1 ;
  59.     return NOERR ;
  60. }
  61.  
  62. static tifLoadPut( buf, lofs, lines ) 
  63. char *buf ;
  64. int lofs, lines ;
  65. {
  66.     int i ;
  67.  
  68.     if( lofs*xtif + lines*xtif > xtif*ytif )
  69.         return -1 ;
  70.  
  71.     if( colorMode == 24 )
  72.     {
  73.         for( i=0 ; i<lines*xtif*3 ; i++ )
  74.         {
  75.             BYTE( imageBuf + lofs*xtif*3 + i )
  76.             = BYTE( buf + i ) ;
  77.         }
  78.     }
  79.     else if( colorMode == 16 )
  80.     {
  81.         for( i=0 ; i<lines*xtif ; i++ )
  82.         {
  83.             int temp, r, g, b ;
  84.  
  85.             temp = WORD( buf + i*2 ) ;
  86.             b = temp & 0x1f ;
  87.             r = ( temp >> 5 ) & 0x1f ;
  88.             g = ( temp >> 10 ) & 0x1f ;
  89.             b <<= 3 ; r <<= 3 ; g <<= 3 ;
  90.             BYTE( imageBuf + lofs*xtif*3 + i*3 ) = r ;
  91.             BYTE( imageBuf + lofs*xtif*3 + i*3 + 1 ) = g ;
  92.             BYTE( imageBuf + lofs*xtif*3 + i*3 + 2 ) = b ;
  93.         }
  94.     }
  95.  
  96.     return NOERR ;
  97. }
  98.  
  99. tifLoad16m( char *work, char *name, char *buffer, int *dx, int *dy )
  100. {
  101.     char *lbp, *dbp, *cbuf ;
  102.     int lbsize, dbsize,bpp, d_line ;
  103.     int comp, fill ;
  104.     long strip, clut, dw ;
  105.  
  106.     imageBuf = buffer ;
  107.  
  108.     lbsize = LOADBUFSIZE ;     /* それぞれのバッファのサイズ */
  109.     dbsize = EXPBUFSIZE ;
  110.     lbp = work;            /* ロードバッファ */
  111.     dbp = lbp + lbsize;        /* 展開バッファ */
  112.     cbuf = dbp + dbsize;        /* 圧縮展開用ワーク */
  113.         /* DECOMP_WORK_SIZEがtifflib.hに定義されてるが
  114.         lbsize+dbsize+DECOMP_WORK_SIZEがworkの大きさを
  115.         こえないように注意すること */
  116.     if( ( fptif = fopen( name, "rb" ) ) == NULL )return READ_FAIL ;
  117.         /* ファイルオープン */
  118.     fread( lbp, 1, lbsize, fptif );    /* 最初のデータロード */
  119.         /* lbsize程のデータが無くてもok! */
  120.     /* ヘッダの解析 */
  121.     if( TIFF_getHead( lbp, lbsize ) < 0 ){
  122.         fclose( fptif );
  123.         return ILLEGAL_DATA ;
  124.     }
  125.     /* タグの内容のチェック */
  126.     bpp = TIFF_checkMode( &xtif,&ytif,&comp,&fill,&strip,&clut );
  127.     if( (bpp != 16) && (bpp != 24) ){
  128.         fclose( fptif );
  129.         return ILLEGAL_DATA ;
  130.     }
  131.     colorMode = bpp ;
  132.     *dx = xtif ;
  133.     *dy = ytif ;
  134.  
  135.     /* バッファ操作関数の登録 */
  136.     TIFF_setLoadFunc(  tifLoadPut, tifLoadGet ) ;
  137.     dw = xtif ;
  138.     /* 16色モードの場合,横方向を8ドット単位で扱うため,一行のデータ
  139.        サイズを計算する際に,8ドット単位に調整しておく必要がある */
  140. //    if( bpp == 4)
  141. //        if( dw & 7 )
  142. //            dw += 8 - (dw & 7) ;
  143.     /* 展開用バッファに何行分のデータが入るかの計算  */
  144.     d_line = dbsize / ((dw * bpp + 7)/ 8) ;
  145.     /* TIFFデータ読み込み  */
  146.     TIFF_loadImage( bpp,xtif,ytif,strip, fill, comp, dbp, dw, d_line, cbuf );
  147.     fclose( fptif );
  148.     return NOERR ;
  149. }
  150.  
  151. /* 1600万色から32k色に変換する関数 */
  152.  
  153. cov16mTo32k( char *sour, char *dest, int n )
  154. {
  155.     int i, r, g, b ;
  156.  
  157.     for( i=0 ; i<n ; i++ )
  158.     {
  159.         r = BYTE( sour + i*3 ) ;
  160.         g = BYTE( sour + i*3 + 1 ) ;
  161.         b = BYTE( sour + i*3 + 2 ) ;
  162.         r >>= 3 ; g >>= 3 ; b >>= 3 ;
  163.         WORD( dest + i*2 ) = b + (r << 5) + (g << 10) ;
  164.     }
  165.     return NOERR ;
  166. }
  167.  
  168. /*
  169.     1600万色用 TIFF saver
  170.  
  171.     1600万色のtifdataをbufferからsave。
  172.     workは COMP_WORK_SIZE + SAVEBUFSIZE + GETBUFSIZEバイト必要。
  173.     ファイル名はname。
  174.     x, yは絵の大きさ。
  175. */
  176.  
  177. /* ライブラリから呼ばれる,バッファに対する操作の関数 */
  178. static tifSavePut( bp, size )
  179. char *bp ;
  180. int size ;
  181. {
  182.     if( fwrite( bp, size, 1, fptif ) < 1 ) 
  183.         return -1 ;
  184.     counter += size ;
  185.     return NOERR ;
  186. }
  187.  
  188. static tifSaveGet( buf, lofs, lines ) 
  189. char *buf ;
  190. int lofs, lines ;
  191. {
  192.     int i ;
  193.  
  194.     if( lofs*xtif + lines*xtif > xtif*ytif )
  195.         return -1 ;
  196.  
  197.     if( colorMode == 24 )
  198.     {
  199.         for( i=0 ; i<lines*xtif*3 ; i++ )
  200.         {
  201.             BYTE( buf + i )
  202.             = BYTE( imageBuf + lofs*xtif*3 + i ) ;
  203.         }
  204.     }
  205.     else if( colorMode == 16 )
  206.     {
  207.         for( i=0 ; i<lines*xtif*2 ; i++ )
  208.         {
  209.             BYTE( buf + i )
  210.             = BYTE( imageBuf + lofs*xtif*2 + i ) ;
  211.         }
  212.     }
  213.  
  214.     return NOERR ;
  215. }
  216.  
  217. tifSave32kAnd16m
  218. (
  219.   char *work, char *name, char *buffer, int bpp, int comp, int x, int y 
  220. )
  221. {
  222.     char *sbp, *ibp, *cbuf ;
  223.     int sbsize, ibsize, i_line, compsize, dw ;
  224.  
  225.     if( (bpp != 16) && (bpp != 24) )
  226.         return ILLEGAL_DATA ;
  227.     colorMode = bpp ;
  228.  
  229.     imageBuf = buffer ;
  230.     if( comp )comp = 5 ;
  231.     else comp = 1 ;
  232.     xtif = x ;
  233.     ytif = y ;
  234.     counter = 0 ;
  235.  
  236.     sbsize = SAVEBUFSIZE ;     /* それぞれのバッファのサイズ */
  237.     ibsize = GETBUFSIZE ;
  238.     sbp = work;            /* ロードバッファ */
  239.     ibp = sbp + sbsize;        /* 展開バッファ */
  240.     cbuf = ibp + ibsize;        /* 圧縮展開用ワーク */
  241.         /* COMP_WORK_SIZEがtifflib.hに定義されてるが
  242.         sbsize+ibsize+DECOMP_WORK_SIZEがworkの大きさを
  243.         こえないように注意すること */
  244.  
  245.         /* ファイルオープン */
  246.     if( ( fptif = fopen( name, "wb" ) ) == NULL )
  247.         return WRITE_FAIL ;
  248.     fseek( fptif, 512, SEEK_SET );    /* header分開ける */
  249.  
  250.     /* バッファ操作関数の登録 */
  251.     TIFF_setSaveFunc(  tifSavePut, tifSaveGet ) ;
  252.     dw = xtif ;
  253.     /* 展開用バッファに何行分のデータが入るかの計算  */
  254.     i_line = ibsize / ((dw * bpp + 7)/ 8) ;
  255.     /* TIFFデータsave  */
  256.     if
  257.     (
  258.       TIFF_saveImage( bpp,xtif,ytif,comp, sbp, sbsize, ibp, dw, i_line, cbuf )
  259.       <= 0
  260.     )
  261.     {
  262.         fclose( fptif ) ;
  263.         remove( name ) ;        /* del */
  264.         return WRITE_FAIL ;
  265.     }
  266.  
  267.     /* TIFF head  */
  268.     if( comp == 1 )compsize = 0 ;
  269.     else compsize = counter ;
  270.     TIFF_setHead( ibp, bpp, xtif, ytif, compsize, ibp ) ;
  271.     fseek( fptif, 0, SEEK_SET );
  272.     if( fwrite( ibp, 512, 1, fptif ) < 1 )
  273.     {
  274.         fclose( fptif ) ;
  275.         remove( name ) ;        /* del */
  276.         return WRITE_FAIL ;
  277.     }
  278.  
  279.     fclose( fptif );
  280.     return NOERR ;
  281. }
  282.  
  283.